package com.xukang.demo.controller;


import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.xukang.demo.entity.ApiResponse;
import com.xukang.demo.entity.ProjectInfo;
import com.xukang.demo.feign.ApiFeign;
import com.xukang.demo.feign.ApiFeign2;
import com.xukang.demo.feign.ServiceFallback;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * SpringBoot 2.0 第一个程序
 */
@RestController
public class HelloController extends BaseController{

    @Autowired
    private ApiFeign apiFeign;
    @Autowired
    private ApiFeign2 apiFeign2;

    /**
     * 模拟feign  调用接口超时，通过Hystrix 服务保护 解决雪崩效应
     * @HystrixCommand 加了 此注解默认
     * 开启线程池隔离方式 ，线程池名证明（范围为整个方法）
     * 服务降级，fallbackMethod 服务不可用时 降级 执行
     * 服务熔断， 配置阈值 ，超过了 就降级
     * @return
     */
    @HystrixCommand(fallbackMethod = "returnHystrixResponse")
    @RequestMapping("/getInfoTimeoutByHystrix")
    public ApiResponse getInfoTimeoutByHystrix() {
        //调用 项目2 的方法
        ProjectInfo asd = apiFeign.getInfoTimeout();
        ApiResponse<ProjectInfo> apiResponse = new ApiResponse();
        apiResponse.setCode("000");
        apiResponse.setData(asd);
        apiResponse.setMsg("线程池名称(隔离的池子)："+Thread.currentThread().getName());
        return apiResponse;
    }

    /**
     * 服务降级 优化 ，以类的形式调用
     * @return
     */
    @RequestMapping("/getInfoTimeoutByHystrix2")
    public ApiResponse getInfoTimeoutByHystrix2() {
        //调用 项目2 的方法
        ProjectInfo asd = apiFeign2.getInfoTimeout();
        ApiResponse<ProjectInfo> apiResponse = new ApiResponse();
        apiResponse.setCode("000");
        apiResponse.setData(asd);
        apiResponse.setMsg("线程池名称(隔离的池子)："+Thread.currentThread().getName());
        return apiResponse;
    }
    /**
     * Feign 调用
     */
    @RequestMapping("/getInfo")
    public ProjectInfo getInfo() {
        //调用 项目2 的方法
        ProjectInfo asd = apiFeign.getInfo();
        return asd;
    }

    /**
     * 模拟feign  调用接口超时，无法解决雪崩效应
     * @return
     */
    @RequestMapping("/getInfoTimeout")
    public ProjectInfo getInfoTimeout() {
        //调用 项目2 的方法
        ProjectInfo asd = apiFeign.getInfoTimeout();
        return asd;
    }
}
